package br.com.futebol.servlet.sistema;

import java.io.File;
import java.io.FileInputStream;
import java.security.Security;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import br.com.futebol.ia.ProvedorInteligencia;
import br.com.futebol.ia.impl.camposPotenciais.pvc.InteligenciaCamposPotenciaisMapaGlobalPVC;
import br.com.futebol.ia.impl.camposPotenciais.pvcGlobalLocal.InteligenciaCamposPotenciaisMapaLocalPVC;
import br.com.futebol.ia.impl.camposPotenciais.pvcGlobalLocal.MapaGlobalPVCPreProcessado;
import br.com.futebol.ia.impl.randomica.InteligenciaRandomica;
import br.com.futebol.ia.impl.rprop.InteligenciaRPROP;
import br.com.futebol.util.CloseUtils;
import br.com.futebol.util.SystemConfig;

/**
 * Carrega as propriedades do sistema
 * 
 * @author Thyago Schleuss - tschleuss@gmail.com
 * @since 24/09/2011
 */
public class InicializaSistema extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private static final Logger LOG = Logger.getLogger(InicializaSistema.class);

    @Override
    public final void init(ServletConfig config) throws ServletException {
        // Registra o provedor de criptografia
        Security.addProvider(new BouncyCastleProvider());

        // Registra os tipos de inteligencia
        ProvedorInteligencia.registraProvedor(new InteligenciaRandomica());
        //ProvedorInteligencia.registraProvedor(new InteligenciaCamposPotenciaisMapaGlobalPVC());
        ProvedorInteligencia.registraProvedor(new InteligenciaCamposPotenciaisMapaLocalPVC());
        MapaGlobalPVCPreProcessado.getInstance();
        ProvedorInteligencia.registraProvedor(new InteligenciaRPROP());
        // Carrega as propriedades do sistema
        this.carregaConfiguracaoLog(config);
        this.carregaConfiguracaoBanco(config);
        this.carregaConfiguracaoGeral(config);
    }

    /**
     * Carrega as propriedades de do banco de dados.
     * 
     * @param config
     */
    private void carregaConfiguracaoBanco(final ServletConfig config) {
        String prePathConfiProperties = null;
        String realPath = null;
        FileInputStream fin = null;

        try {

            prePathConfiProperties = String.valueOf(config.getInitParameter("configuracaoBanco"));

            if (prePathConfiProperties == null) {
                LOG.error("Configure o caminho do arquivo de propriedades de banco do sistema!");
            } else {
                realPath = config.getServletContext().getRealPath(prePathConfiProperties);
                fin = new FileInputStream(new File(realPath));
                SystemConfig.getInstance().loadDatabaseProperties(fin);
            }

        } catch (Exception e) {
            LOG.error("Erro ao inicializar as configuracoes de banco do sistema.", e);
        } finally {
            CloseUtils.close(fin);
        }
    }

    /**
     * Carrega as propriedades gerais do sistema.
     * 
     * @param config
     */
    private void carregaConfiguracaoGeral(final ServletConfig config) {
        String prePathConfiProperties = null;
        String realPath = null;
        FileInputStream fin = null;

        try {

            prePathConfiProperties = String.valueOf(config.getInitParameter("configuracaoGeral"));

            if (prePathConfiProperties == null) {
                LOG.error("Configure o caminho do arquivo de propriedades gerais do sistema!");
            } else {
                realPath = config.getServletContext().getRealPath(prePathConfiProperties);
                fin = new FileInputStream(new File(realPath));
                SystemConfig.getInstance().loadGeralProperties(fin);
            }

        } catch (Exception e) {
            LOG.error("Erro ao inicializar as configuracoes gerais do sistema.", e);
        } finally {
            CloseUtils.close(fin);
        }
    }

    /**
     * Carrega as propriedades de log do sistema.
     * 
     * @param config
     */
    private void carregaConfiguracaoLog(final ServletConfig config) {
        String prePathConfiProperties = null;
        String realPath = null;
        FileInputStream fin = null;

        try {

            prePathConfiProperties = String.valueOf(config.getInitParameter("configuracaoLog"));

            if (prePathConfiProperties == null) {
                LOG.error("Configure o caminho do arquivo de propriedades de log do sistema!");
            } else {
                realPath = config.getServletContext().getRealPath(prePathConfiProperties);
                fin = new FileInputStream(new File(realPath));
                SystemConfig.getInstance().loadLogProperties(fin);
                PropertyConfigurator.configure(SystemConfig.getInstance().getLogProperties());
            }

        } catch (Exception e) {
            LOG.error("Erro ao inicializar as configuracoes gerais do sistema.", e);
        } finally {
            CloseUtils.close(fin);
        }
    }
}
